package com.mjlf.mjatis.core;

import com.mjlf.mjatis.config.Configuration;
import com.mjlf.mjatis.mapper.MapperProxyFactory;

import java.util.Set;

/**
 * @ClassName SqlSession
 * @Author mjlft
 * @Date 2020/5/26 22:59
 * @Version 1.0
 * @Description SqlSession类是Sql执行的入口， 它管理者所有的框架组件， 如果需要拓展
 * 或更新框架运行内容， 需要拿到这个类对象，它有点像Spring中ApplicationContext类
 */
public interface SqlSession {

    Configuration getConfiguration();

    MapperProxyFactory getMapperProxyFactory();

    void setConfiguration(Configuration configuration);

    /**
     * 刷新Configuration
     * 主要并发安全
     * @param configuration
     */
    void flushConfiguration(Configuration configuration);

    /**
     * 添加Mapper到SqlSession
     * @param types
     */
    void addMappers(Set<Class<?>> types);

    /**
     * 添加单个Mapper到SqlSession
     * @param type
     */
    void addMapper(Class<?> type);

    /**
     * 刷新Mapper
     */
    void flushMapper();


    /**
     * 刷新别名
     */
    void flushAlisa();

    /**
     * 刷新数据源
     */
    void flushDataSource();

    /**
     * 刷新环境
     */
    void flushEnvironment();

    /**
     * 刷新插件
     */
    void flushPlugins();

    /**
     * 返回Mapper
     * @param clazz
     * @param <T>
     * @return
     */
    <T>T getMapper(Class<T> clazz);
}
